package fr.upmc.aladyn.transactionables.tests.application;

import fr.upmc.aladyn.transactionables.annotations.Transactionable;

/**
 * <p>Test class</p>
 * @author Alexis Deluze
 *
 */

@Transactionable
public class Couple {

	private Adulte adulte1;
	private Adulte adulte2;

	public Couple(Adulte a1, Adulte a2) {
		adulte1 = a1;
		adulte2 = a2;
	}
	
	public void print(){
		System.out.println("\n#--------------------------\n# Couple"
				+"\n# Adulte 1 = "+adulte1.getNom()
				+"\n# Adulte 2 = "+adulte2.getNom()
				+"\n#--------------------------\n");
	}
	
	@Transactionable
	public void mort(Personne personne) throws AlreadyDeadException{
		System.out.println("\n#--------------------------");
		System.out.println("# "+ personne.getNom() + " meurs");
		System.out.println("#--------------------------\n");
		if(personne.getEtatCivil() == EtatCivil.Mort){
			throw new AlreadyDeadException();
		}else{
			if(personne instanceof Adulte){
				if(((Adulte)personne).getConjoint() != null && personne.getEtatCivil() == EtatCivil.Marie){
					((Adulte)personne).getConjoint().setEtatCivil(EtatCivil.Veuf);
					((Adulte)personne).getConjoint().deposerArgent(((Adulte) personne).getCompteBancaire());
					((Adulte) personne).retirerArgent(((Adulte) personne).getCompteBancaire());
				}
				else if(((Adulte)personne).getConjoint() != null){
					((Adulte)personne).getConjoint().setConjoint(null);
					((Adulte)personne).setConjoint(null);
				}
			}
			personne.setEtatCivil(EtatCivil.Mort);
		}

	}
	
	@Transactionable
	public void naissance(String nomEnfant){
		Enfant e = new Enfant(nomEnfant, 0);
		System.out.println("\n#--------------------------");
		System.out.println("# Nouvelle naissance dans le couple ");
		System.out.println("#--------------------------\n");
		e.setParents(adulte1, adulte2);
		e.print();
	}
	
	@Transactionable
	public void divorce(Adulte adulte1, Adulte adulte2) throws AlreadySingleException{
		System.out.println("\n#--------------------------");
		System.out.println("# "+adulte1.getNom() + " et " + adulte2.getNom() + " divorcent.");
		System.out.println("#--------------------------\n");
		adulte1.retirerArgent(650);
		adulte2.retirerArgent(650);
		if(adulte1.getConjoint() == null | adulte2.getConjoint() == null){
			throw new AlreadySingleException();
		}
		adulte1.setEtatCivil(EtatCivil.Divorce);
		adulte2.setEtatCivil(EtatCivil.Divorce);
		adulte1.setConjoint(null);
		adulte2.setConjoint(null);
	}
	
	@Transactionable
	public void mariage(Adulte adulte1, Adulte adulte2) throws AlreadyMariedException{
		System.out.println("\n#--------------------------");
		System.out.println("# "+adulte1.getNom() + " et "+ adulte2.getNom() +" se marient.");
		System.out.println("#--------------------------\n");
		adulte1.deposerArgent(330);
		adulte2.deposerArgent(330);
		if(adulte1.getConjoint() != null | adulte2.getConjoint() != null){
			throw new AlreadyMariedException();
		}
		adulte1.setConjoint(adulte2);
		adulte2.setConjoint(adulte1);
	}
}
